﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop.AbmChofer
{
    public partial class frmFormChofer : BaseForm
    {
        Chofer ChoferAModificar;
        frmListadoChofer FormPadre;
        public frmFormChofer(Chofer choferAModificar, frmListadoChofer formPadre)
        {
            ChoferAModificar = choferAModificar;
            FormPadre = formPadre;
            InitializeComponent();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                if (ChoferAModificar != null)
                    ChoferAModificar = Transaccion.Factoria<FactoriaChofer>().SelectXId<Chofer>(ChoferAModificar.Id.ToString());
                base.OnVisibleChanged(e);

                if (ChoferAModificar != null)
                    CargarDatosEnForm();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarDatosEnForm()
        {
            txtApellido.Text = ChoferAModificar.Apellido;
            txtDni.Text = ChoferAModificar.Dni.ToString();
            txtDomicilio.Text = ChoferAModificar.Direccion;
            txtEmail.Text = ChoferAModificar.Mail;
            txtNombre.Text = ChoferAModificar.Nombre;
            txtTelefono.Text = ChoferAModificar.Telefono.ToString();
            dtpFechaNac.Value = ChoferAModificar.FechaNacimiento;
            chkHabilitado.Checked = ChoferAModificar.Habilitado;
        }

        private void butGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarForm())
                {
                    if (ChoferAModificar != null)
                    {
                        try
                        {
                            ChoferAModificar = Transaccion.Factoria<FactoriaChofer>().SelectXId<Chofer>(ChoferAModificar.Id.ToString());
                            CargarChofer(ChoferAModificar);
                            Transaccion.Persistir();
                            MessageBox.Show("El chofer se ha guardado con exito");
                            if (FormPadre != null) FormPadre.CargarConFiltros();
                            this.Hide();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ConstruirError(ex.Message));
                        }
                    }
                    else
                        try
                        {
                            Chofer choferNuevo = Transaccion.Factoria<FactoriaChofer>().Nuevo(txtApellido.Text,
                                txtNombre.Text, Convert.ToInt32(txtDni.Text), txtDomicilio.Text,
                                txtEmail.Text, Convert.ToInt32(txtTelefono.Text), dtpFechaNac.Value,
                                chkHabilitado.Checked);
                            Transaccion.Persistir();
                            MessageBox.Show("El chofer se ha guardado con exito");

                            this.Hide();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ConstruirError(ex.Message));
                        }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarChofer(Chofer ChoferAModificar)
        {
            ChoferAModificar.Apellido = txtApellido.Text;
            ChoferAModificar.Direccion = txtDomicilio.Text;
            ChoferAModificar.Dni = Convert.ToInt32(txtDni.Text);
            ChoferAModificar.FechaNacimiento = dtpFechaNac.Value;
            ChoferAModificar.Habilitado = chkHabilitado.Checked;
            ChoferAModificar.Mail = txtEmail.Text;
            ChoferAModificar.Nombre = txtNombre.Text;
            ChoferAModificar.Telefono = Convert.ToInt32(txtTelefono.Text);
        }

        private bool ValidarForm()
        {
            string error = string.Empty;

            if (string.IsNullOrEmpty(txtApellido.Text))
                error += "Debe completar el campo Apellido " + Environment.NewLine;

            if (string.IsNullOrEmpty(txtDni.Text))
                error += "Debe completar el campo Dni " + Environment.NewLine;
            else if (txtDni.Text.Length > 18)
                error += "El campo Dni no puede exceder los 18 caracteres" + Environment.NewLine;

            if (string.IsNullOrEmpty(txtDomicilio.Text))
                error += "Debe completar el campo Domicilio " + Environment.NewLine;

            if (string.IsNullOrEmpty(txtNombre.Text))
                error += "Debe completar el campo Nombre " + Environment.NewLine;

            if (string.IsNullOrEmpty(txtTelefono.Text) || !ValidatorHelper.isNumericLongFieldValid(txtTelefono.Text))
                error += "Debe completar el campo Telefono con un número válido " + Environment.NewLine;

            if (dtpFechaNac.Value.Date == DateTime.Today.Date)
                error += "Debe seleccionar una fecha valida para el campo Fecha de nacimiento " + Environment.NewLine;

            if (!string.IsNullOrEmpty(error))
                MessageBox.Show(error, "Auto", MessageBoxButtons.OK, MessageBoxIcon.Error);

            return string.IsNullOrEmpty(error);
        }

        private string ConstruirError(string p)
        {
            string error = string.Empty;
            if (p.Contains("Violation of UNIQUE KEY constraint"))
                error = "ERROR: El campo DNI no puede estar repetido entre 2 choferes";
            else
                error = p;

            return error;
        }

        private void frmFormChofer_Load(object sender, EventArgs e)
        {

        }

    }
}
